package cn.iocoder.yudao.module.lowcode.dal.mapper.generic;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.lowcode.controller.admin.generic.vo.GenericTableExportReqVO;
import cn.iocoder.yudao.module.lowcode.controller.admin.generic.vo.GenericTablePageReqVO;
import cn.iocoder.yudao.module.lowcode.dal.dataobject.datasource.LowcodeDataSourceConfigDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 通用表格管理 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface GenericTableMapper {

    /**
     * 分页查询
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param pageReqVO 分页参数
     * @return 分页结果
     */
    PageResult<Map<String, Object>> selectPage(@Param("tableName") String tableName,
                                               @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
                                               @Param("pageReqVO") GenericTablePageReqVO pageReqVO);

    /**
     * 查询列表
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param exportReqVO 导出参数
     * @return 结果列表
     */
    List<Map<String, Object>> selectList(@Param("tableName") String tableName,
                                         @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
                                         @Param("exportReqVO") GenericTableExportReqVO exportReqVO);

    /**
     * 插入记录
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param data 数据
     * @return 新增记录的ID
     */
    Long insert(@Param("tableName") String tableName,
                @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
                @Param("data") Map<String, Object> data);

    /**
     * 更新记录
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param id 记录ID
     * @param data 更新数据
     * @return 影响行数
     */
    int update(@Param("tableName") String tableName,
               @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
               @Param("id") Long id,
               @Param("data") Map<String, Object> data);

    /**
     * 删除记录
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param id 记录ID
     * @return 影响行数
     */
    int delete(@Param("tableName") String tableName,
               @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
               @Param("id") Long id);

    /**
     * 批量删除记录
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param ids ID列表
     * @return 影响行数
     */
    int batchDelete(@Param("tableName") String tableName,
                    @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
                    @Param("ids") List<Long> ids);

    /**
     * 检查记录是否存在
     *
     * @param tableName 表名
     * @param dataSource 数据源配置
     * @param id 记录ID
     * @return 是否存在
     */
    boolean exists(@Param("tableName") String tableName,
                   @Param("dataSource") LowcodeDataSourceConfigDO dataSource,
                   @Param("id") Long id);

}